{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**通用最佳实践回顾**\n",
    "\n",
    "- `std::set<Key>` 以平衡搜索树（通常为红黑树）维护唯一键的严格弱序，插入、查找、删除均为 `O(log n)`，适用于需要自动去重、保持排序或快速定位最小/最大元素的场景。\n",
    "- 插入操作不会使现有迭代器失效；删除仅影响被移除元素。遍历删除时使用 `it = set.erase(it)` 或 `erase(range)` 以确保迭代器安全。\n",
    "- 结合 `lower_bound` / `upper_bound` 可以高效完成前缀枚举、范围查询；`extract`（C++17 起）可在不复制元素的情况下调整键或迁移节点。\n",
    "- 透明比较器（如 `std::less<>`）支持异构查找，避免构造临时对象；在查找频繁的场景能显著减少分配。\n",
    "- 集合运算可借助 `<algorithm>` 中的 `set_union`、`set_intersection`、`set_difference` 等通用算法；`std::set` 的有序性保证结果亦为有序。\n",
    "- 若需要频繁随机访问或哈希查找，需权衡 `std::unordered_set`；若集合小且重建成本低，可考虑 `std::vector` + 排序/去重。\n",
    "- 对于需要最小/最大弹出队列的场景，`std::set` 可兼作“有序优先队列”，利用 `begin()` / `rbegin()` 取得极值，并通过 `extract`/`erase` 快速移除。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| 序号 | 工程场景                        | 文件名                         | 说明要点                                                     | 可运行示例代码             |\n",
    "| ---- | ------------------------------- | ------------------------------ | ------------------------------------------------------------ | -------------------------- |\n",
    "| 1    | 去重有序集合；有序导出          | `set_unique_sorted_export.cpp` | 利用 `std::set` 自动去重并保持排序；导出到容器实现有序输出   | 示例 1：去重与有序导出     |\n",
    "| 2    | 白/黑名单；差并交集合运算       | `set_whitelist_ops.cpp`        | 使用 `<algorithm>` 的集合运算求交并差；演示 `erase` 安全删除 | 示例 2：白名单集合运算     |\n",
    "| 3    | 已访问节点集（需最小/最大弹出） | `set_frontier_minmax.cpp`      | `std::set` 作为有序优先队列；`begin()` / `rbegin()` 弹出极值 | 示例 3：有序弹出与访问集   |\n",
    "| 4    | 有序唯一键索引（如字典序）      | `set_dictionary_index.cpp`     | 维护字典序索引；`lower_bound` 前缀搜索；透明比较器支持 `string_view` 查找 | 示例 4：字典索引与前缀枚举 |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 示例 1：去重与有序导出（set_unique_sorted_export.cpp）\n",
    "- 示例 2：白名单集合运算（set_whitelist_ops.cpp）\n",
    "- 示例 3：有序弹出与访问集（set_frontier_minmax.cpp）\n",
    "- 示例 4：字典索引与前缀枚举（set_dictionary_index.cpp）"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
